<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>


    <script>

        // 一个函数无法访问另一个函数的局部变量 
        // 除非  他们是嵌套关系



        // 当函数里面和外面都想访问一个变量的时候，一般会声明全局变量
        // 但是全局变量容易造成变量污染 --- 可能会被覆盖



        // 闭包：
        //    把这个变量"保护"起来 ， 但是外面也可以使用





        // function outer() {
        //     var a = 1;
        //     function inner() {   // 内层函数必定访问这个局部变量
        //         console.log(a);
        //     }
        //     return inner    // 且最终返回这个函数
        // }


        // const res = outer();
        // res()



        // var a = 'hi';


        // res()



        // 假如有100块


        // let money = 100;

        // // 1000
        // function fn(v) {
        //     money += v
        // }

        // fn(1000);



        // console.log(money);

        // fn(-10000);

        // console.log(money);


        function outer() {
            let money = 100;
            return function (v) {
                money += v;
                return money
            }
        }

        const res = outer();

        console.log(res(1000));

        console.log(res(-10000));

        console.log(res(20000));


        let money = 300000;

        console.log(res(200));







        function f() {
            let a = 1;
            return function () {
                console.log(++a);
            }
        }


        // 函数每调用一次  就会在该作用域下创建一个变量a


        f()()   // 2

        let ff = f();    // ff保留了内层函数   也就间接的保留住了变量a
        ff();   // 2
        ff();   // 3
        ff();   // 4

        f()()   // 2

        ff()   // 5

        const f2 = f();
        f2();   // 2
        f2();   // 3

        ff()   // 6


        ff = null;   // 让这个ff指向新的地址










    </script>

</body>

</html>